﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using EFDataModel;
using EFDataModel.Enums;

namespace ContactManagement.AppCode.DynamicDataType
{
    /// <summary>
    /// Erstellen der Detailsansicht für unser UserControl, hier werden nur Label für die Anzeige erstellt.
    /// </summary>
    public class DynamicDataDisplayControlCreator
    {
        #region Properties
        /// <summary>
        /// Der Aktuelle HTMLHelpder
        /// </summary>
        public HtmlHelper CurrentHtmlHelper { get; set; }

        /// <summary>
        /// Der Dynamische Datentyp um den es sich handelt der abgebildet werden soll
        /// </summary>
        public EFDynamicDataType CurrentDynamicDataType { get; set; }

        /// <summary>
        /// Der Text der angezeigt werden soll in der Textbox oder ausgewählt werden soll in der DDL
        /// </summary>
        public dynamic Value { get; set; }

        /// <summary>
        /// stellt das aktuelle Kontrol dar, was erstellt wird als String
        /// </summary>
        private string CurrentControl { get; set; }
        #endregion

        #region Konstruktor
        /// <summary>
        /// Initialisieren der Klasse die das kontroll erstellt.
        /// </summary>
        /// <param name="htmlHelper">der Aktuelle HTML Helpder</param>
        /// <param name="efDynamicDataType">Der Datentyp der dargestellt werden soll</param>
        /// <param name="value">Der value der angezeigt werden soll | wenn keiner angeben wurde Null übergeben!</param>
        public DynamicDataDisplayControlCreator(HtmlHelper htmlHelper, EFDynamicDataType efDynamicDataType, dynamic value)
        {
            CurrentHtmlHelper = htmlHelper;
            CurrentDynamicDataType = efDynamicDataType;
            Value = value;
            CurrentControl = string.Empty;
        }
        #endregion

        #region Public Functions
        /// <summary>
        /// Erstellen des passenden HTML-Controls.
        /// Hier wird ein Label erstellt und wir passen nur noch den Inhalt der Daten an den jeweiligen hinterlegten Formatstring an.
        /// </summary>
        public string CreateHtmlControl()
        {
            string currentValue = string.Empty;
            //Prüfen ob ein Wert angegeben wurde.
            if (Value != null)
            {
                if (!string.IsNullOrEmpty(CurrentDynamicDataType.FormatString))
                {
                    //Wenn ein Formatstring für den aktuellen Datentyp angegeben wurde, dann den Wert passend formatiert ausgeben
                    currentValue = CreateFormatedOutput();
                }
                else
                {
                    //Den Standardwert zurück geben "unformatiert"
                    currentValue = CreateDefaultOutput();
                }
            }

            //Erstellen des Labels was angezeigt werden soll
            CurrentControl = CurrentHtmlHelper.Label(CurrentDynamicDataType.HtmlName, currentValue).ToHtmlString();
            return CurrentControl;
        }
        #endregion

        #region Private
        /// <summary>
        /// Erstellen des Outputcontrols wo ein Formatstring hinterlegt wurde
        /// </summary>
        private string CreateFormatedOutput()
        {
            //Wenn es sich um den Listenwert handelt, muss erst der entsprechende String herausgesucht werden, denn im Value steht nur die Id für den Datensatz der angezeigt werden soll
            if (CurrentDynamicDataType.DynamicDataType == EFDynamicDataTypes.List)
            {
                //Den Wert aus einer Statischen Liste laden
                DynamicDataTypeListEntry currentValue = DynamicDataTypeListEntry.GetStaticDynamicDataTypeListEntry((int) Value, CurrentHttpContext.GetDataModel());
                if (currentValue != null)
                {
                    return string.Format(CurrentDynamicDataType.FormatString, currentValue.Name);
                }

                return string.Empty;
            }
            
            //Im FormatString muss quasi schon der Platzhalter für unseren Wert mit vorgesehen sein z.B. "{0:##} EUR" oder "{0:dd.MM.yyyy}"
            return string.Format(CurrentDynamicDataType.FormatString, Value);
        }

        /// <summary>
        /// Erstellen eines Outputcontrols wo kein Formatstring hinterlegt wurde
        /// </summary>
        private string CreateDefaultOutput()
        {
            //Wenn kein FormatString vorgelegt wurde, dann muss hier dementsprechend der Wert "Standardformatiert" werden
            //Dazu muss jeweils auch noch auf den Datentyp geachtet werden der dargestellt werden soll
            if (CurrentDynamicDataType.DynamicDataType == EFDynamicDataTypes.Datetime)
            {
                return ((DateTime)Value).ToString(WebConstants.InputDateTimeFormat);
            }

            //Bei Boolean Feldern wird Ja/Nein angezeigt für ausgewählt nicht ausgewählt
            if (CurrentDynamicDataType.DynamicDataType == EFDynamicDataTypes.Boolean)
            {
                return Value ? App_GlobalResources.GlobalStrings.YesRESX : App_GlobalResources.GlobalStrings.NoRESX;
            }

            //Anzeigen von Integer oder Decimalwerten Werten
            if (CurrentDynamicDataType.DynamicDataType == EFDynamicDataTypes.Integer || CurrentDynamicDataType.DynamicDataType == EFDynamicDataTypes.Decimal)
            {
                return Value.ToString();
            }

            //Für Listenwerte steht im aktuellen Value nur die Id die ausgewählt wurde und angezeigt werden soll, daher muss der Name erst noch herausgesucht we
            if (CurrentDynamicDataType.DynamicDataType == EFDynamicDataTypes.List)
            {
                //Den Wert aus einer Statischen Liste laden
                DynamicDataTypeListEntry currentValue = DynamicDataTypeListEntry.GetStaticDynamicDataTypeListEntry((int)Value, CurrentHttpContext.GetDataModel());
                if (currentValue != null)
                {
                    return currentValue.Name;
                }

                return string.Empty;
            }

            //Einfach den Wert direkt zurückgeben
            return Value.ToString();
        }
        #endregion
    }
}